前端时间公司有一个项目要批量打印,主要是打印准考证,考试成绩,以及考试证书。参考方案,前端打印,后端打印
后端打印
后端打印主要是用wkhtmltopdf这个,这个框架需要在后端安装一大堆东西,先生成pdf在打印。一句话,一旦出现了问题,修复起来会非常困难,关键代码就一行。但是调试起来却异常困难。
options = {
'page-size': 'A4',
'orientation': 'Landscape',
'encoding': 'utf-8',
'zoom': 8,
'margin-bottom': '0in',
'margin-top': '0in',
'margin-left': '0in',
'margin-right': '0in',
}
config = pdfkit.configuration(wkhtmltopdf='/usr/local/bin/wkhtmltopdf')
pdfkit.from_url(weburl,filepath, options=options, configuration=config)
问题往往出现在pdfkit.from_url(),往往在测试环境没有问题,在正式环境上就不行。因为出问题的频率太过频繁,所以考虑换方案
前端打印
一番搜索就下列几种方式,比较好一点
jspdf 打印 addHTML
<script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script>
<script src="http://html2canvas.hertzen.com/build/html2canvas.js"></script>
<script src="https://cdn.jsdelivr.net/ace/1.1.01/noconflict/ace.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" src="dist/jspdf.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
var pdf = new jsPDF('p', 'pt', 'a4');
printbypage(pdf, 0);
});
function printbypage(pdf, k) {
console.log(k);
var options = {
background: '#FFFFFF'
};
pdf.addHTML($('.dtable')[k], options,
function() {
if (k < $('.dtable').length - 1) {
console.log('true') pdf.addPage();
printbypage(pdf, k + 1);
} else {
pdf.save("打印成绩单.pdf");
}
});
};
</script>
结论:存在问题打印时背景黑,数据量大后黑屏率100%
jspdf 打印 addImage
<script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script>
<script src="http://html2canvas.hertzen.com/build/html2canvas.js"></script>
<script src="https://cdn.jsdelivr.net/ace/1.1.01/noconflict/ace.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" src="dist/jspdf.min.js">
<script type="text/javascript">
$(document).ready(function() {
var pdf = new jsPDF('landscape', 'pt', 'a4');
printbypage(pdf, 0);
});
function printbypage(pdf, k) {
html2canvas($('.dtable')[k], {
taintTest: false,
allowTaint: true,
background: 'white',
onrendered: function(canvas) {
console.log(k) if (k < $('.dtable').length) {
console.log(true) var pageData = canvas.toDataURL('image/jpeg', 1.0);
pdf.addImage(pageData, 'JPEG', 0, 0, 841.89, 595.28);
if (k != $('.dtable').length - 1) {
pdf.addPage();
}
printbypage(pdf, k + 1);
} else {
pdf.save("打印证书.pdf");
}
}
})
};
</script>
结论:存在问题打印时背景黑,数据量大后黑屏率100%,小数据量好一些
$("#myElementId").print({
globalStyles: true,
mediaPrint: false,
stylesheet: null,
noPrintSelector: ".no-print",
iframe: true,
append: null,
prepend: null,
manuallyCopyFormValues: true,
deferred: $.Deferred(),
timeout: 750,
title: null,
doctype: '<!doctype html>'
});
结论:开源组织提供的,一般性打印需求可以满足,无法调整边距,纸张打印方向之类。底层都是window.print()实现,优点,使用起来非常方便
window.print 方法
这个是系统自带的,可以调整边距,可以调整纸张方向,我最终使用的是这个,不同浏览器自己做支持,要是出现了问题,一般都可以解决
//分页参数
style="page-break-before:always;height:667px"
css的属性,主要浏览器都支持
@media print {
selector{
...
}
}
Lodop插件
这个打印插件我并没有使用,需要用户安装,收费
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。